package com.xiaoshuidi.cloud.module.member.controller.admin.coupon.vo;

import com.alibaba.fastjson.JSONArray;
import com.xiaoshuidi.cloud.module.member.enums.coupon.CouponStatusEnum;
import com.xiaoshuidi.cloud.module.member.enums.coupon.CouponStatusOperateEnum;
import com.xiaoshuidi.cloud.module.member.enums.coupon.CouponTypeEnum;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import org.apache.commons.lang3.StringUtils;

import javax.validation.constraints.NotNull;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;


/**
 * @author Alex
 * @version generator
 * @description 优惠券表Vo实体
 * @date 2023-03-14 15:06:11
 */
@Data
public class CouponDetailedOneVo {

    /**
     * 优惠券id
     */
    @Schema(description = "优惠券id")
    private Long id;
    /**
     * 优惠券类型 1预定优惠|2老带新优惠|3新签约优惠|4 内部员工优惠|5其他优惠
     */
    @Schema(description = "优惠券类型 1预定优惠|2老带新优惠|3新签约优惠|4 内部员工优惠|5其他优惠")
    private Integer couponType;
    /**
     * 优惠券名称
     */
    @Schema(description = "优惠券名称")
    private String couponName;
    /**
     * 优惠类型|0 立减|1 折扣
     */
    @Schema(description = "优惠类型|0 立减|1 折扣")
    private Integer preferentialContentType;
    /**
     * 优惠金额 或者百分比
     */
    @Schema(description = "优惠金额 或者百分比")
    private BigDecimal marginPreference;
    /**
     * 老客 优惠类型| 0 立减|1 折扣
     */
    @Schema(description = "老客 优惠类型| 0 立减|1 折扣")
    private Integer preferentialContentTypeOld;
    /**
     * 老客 优惠金额 或者百分比
     */
    @Schema(description = "老客 优惠金额 或者百分比")
    private BigDecimal marginPreferenceOld;
    /**
     * 优惠券库存量 -1没有限制
     */
    @Schema(description = "优惠券库存量 -1没有限制")
    private Long stock;
    /**
     * 优惠券剩余量 -1没有限制
     */
    @Schema(description = "优惠券剩余量 -1没有限制")
    private Long surplusStock;
    /**
     * 优惠券使用量
     */
    @Schema(description = "优惠券使用量")
    private Long couponUsage;
    /**
     * 使用规则
     */
    @Schema(description = "使用规则")
    private String useRules;
    /**
     * 活动开始时间
     */
    @Schema(description = "活动开始时间")
    private Date activityStartTime;
    /**
     * 活动结束时间
     */
    @Schema(description = "活动结束时间")
    private Date activityEndTime;
    /**
     * 活动门店 -1不限制门店
     */
//    @Schema(description = "活动门店 -1不限制门店")
//    private Long activityStore;

    @Schema(description = "活动门店 -支持多门店")
    private List<Long> apartmentIds;
    /**
     * 预定开始时间
     */
    @Schema(description = "预定开始时间")
    private Date scheduledStartTime;
    /**
     * 预定结束时间
     */
    @Schema(description = "预定结束时间")
    private Date scheduledEndTime;
    /**
     * 预定金额
     */
    @Schema(description = "预定金额")
    private BigDecimal scheduledAmount;
    /**
     * 最低租赁月份
     */
    @Schema(description = "最低租赁月份")
    private Integer miniLeaseMonth;
    /**
     * 最高租赁月份
     */
    @Schema(description = "最高租赁月份")
    private Integer maxLeaseMonth;
    /**
     * 签约开始日期
     */
    @Schema(description = "签约开始日期")
    private Date signingStartTime;
    /**
     * 签约结束时间
     */
    @Schema(description = "签约结束时间")
    private Date signingEndTime;
    /**
     * 使用类型 1合同期内有效 2 发券后多少天 3 固定日期
     */
    @Schema(description = "使用类型")
    private Integer couponUsageTimeType;
    /**
     * 使用日期 -1 合同期内有效 | 大于0 发券后多少天有效
     */
    @Schema(description = "使用日期 -1 合同期内有效|大于0 发券后多少天有效")
    private Integer couponUsageTime;
    /**
     * 使用开始时间
     */
    @Schema(description = "使用开始时间")
    private Date expirationStartTime;
    /**
     * 使用结束时间
     */
    @Schema(description = "使用结束时间")
    private Date expirationEndTime;
    /**
     * 发券数量限制 -1 不限制|大于0 限制张数
     */
    @Schema(description = "发券数量")
    private Integer quantityLimit;
    /**
     * 使用叠加 1与同一优惠可叠加使用|2 与其他活动可叠加使用
     */
    @Schema(description = "使用叠加 1与同一优惠可叠加使用|2 与其他活动可叠加使用")
    private String couponUseOverlay;
    /**
     * 凭证
     */
    @Schema(description = "凭证")
    private String fileUrls;
    /**
     * 状态| 1【未提交】：操作有 查看、编辑、删除|2【审核中】：操作有 查看|3【审批驳回】：操作有 查看、编辑、删除|4【未开始】：操作有 查看、终止
     * |5【进行中】：操作有 查看、数据、终止|6【已终止】手动终止后，不能继续发券，记录终止时间|7【已结束】：操作有 查看、数据
     */
    @Schema(description = "状态| 1【未提交】：操作有 查看、编辑、删除|2【审核中】：操作有 查看|3【审批驳回】：操作有 查看、编辑、删除|4【未开始】：操作有 查看、终止\n" +
            "|5【进行中】：操作有 查看、数据、终止|6【已终止】手动终止后，不能继续发券，记录终止时间|7【已结束】：操作有 查看、数据")
    private Integer couponStatus;
    /**
     * 创建人名
     */
    @Schema(description = "创建人名")
    private String createdName;
    /**
     * 创建人
     */
    @Schema(description = "创建人")
    private String creator;
    /**
     * 修改人
     */
    @Schema(description = "修改人")
    private String updater;
    /**
     * 创建时间
     */
    @Schema(description = "创建时间")
    private Date createTime;
    /**
     * 修改时间
     */
    @Schema(description = "修改时间")
    private Date updateTime;
    /**
     * 是否删除 0-未删除 1-已删除
     */
//    @Schema(description = "是否删除 0-未删除 1-已删除")
//    private Integer isDelete;
    @Schema(description = "优惠券类型 1预定优惠|2老带新优惠|3新签约优惠|4 内部员工优惠|5其他优惠")
    private String couponTypeName;
    /**
     * 优惠券库存量 -1没有限制
     */
    @Schema(description = "优惠券库存量 -1没有限制")
    private String stockName;
    /**
     * 优惠券剩余量 -1没有限制
     */
    @Schema(description = "优惠券剩余量 -1没有限制")
    private String surplusStockName;
    @Schema(description = "状态名")
    private String couponStatusName;
    @Schema(description = "操作")
    private Operate operate;
    @Schema(description = "优惠内容")
    private String couponContent;
    @Schema(description = "门店")
    private String activityStoreName;

    @Schema(description = "是否可叠加使用")
    private String couponUseOverlayName;

    @Schema(description = "审批表id")
    private String processInstanceId;


    public String getCouponUseOverlayName() {
        if (StringUtils.isBlank(couponUseOverlay)) {
            couponUseOverlayName = "不可与其他优惠券叠加使用";
        }
        //使用叠加 1与同一优惠可叠加使用|2 与其他活动可叠加使用
        if (couponUseOverlay.contains("1")) {
            couponUseOverlayName = "可与同一优惠可叠加使用";
        }
        if (couponUseOverlay.contains("2")) {
            couponUseOverlayName = "可与其他活动可叠加使用";
        }
        if (couponUseOverlay.contains("1") && couponUseOverlay.contains("2")) {
            couponUseOverlayName = "可与同一优惠可叠加使用、可与其他活动可叠加使用";
        }
        return couponUseOverlayName;
    }


    public String getCouponTypeName() {
        return CouponTypeEnum.getDesc(couponType);
    }

    public String getCouponContent() {
        String couponContent = "";
        if (couponType != 3 && preferentialContentType == 0) {
            couponContent = "立减" + marginPreference.setScale(0, BigDecimal.ROUND_HALF_DOWN) + "元";
        }
        if (couponType != 3 && preferentialContentType == 1) {
            couponContent = "打" + marginPreference + "折";
        }
        if (couponType == 3) {
            couponContent = "新客" + couponContent + ";";
            if (preferentialContentTypeOld == 0) {
                couponContent = couponContent + "老客立减" + marginPreferenceOld.setScale(0, BigDecimal.ROUND_HALF_DOWN) + "元";
            } else {
                couponContent = couponContent + "老客打" + marginPreferenceOld + "折";
            }
        }
        return couponContent;
    }

    @Data
    public class Operate {
        @Schema(description = "查看")
        private Boolean vie;
        @Schema(description = "编辑")
        private Boolean edi;
        @Schema(description = "删除")
        private Boolean del;
        @Schema(description = "编辑")
        private Boolean dat;
        @Schema(description = "终止")
        private Boolean ter;
        @Schema(description = "启动")
        private Boolean sta;

        public Operate(Boolean vie, Boolean edi, Boolean del, Boolean dat, Boolean ter, Boolean sta) {
            this.vie = vie;
            this.edi = edi;
            this.del = del;
            this.dat = dat;
            this.ter = ter;
            this.sta = sta;
        }
    }


    public String getStockName() {
        if (stock == -1) {
            stockName = "无限制";
        } else {
            stockName = String.valueOf(stock);
        }
        return stockName;
    }

    public String getSurplusStockName() {
        if (surplusStock == -1) {
            surplusStockName = "无限制";
        } else {
            surplusStockName = String.valueOf(surplusStock);
        }
        return surplusStockName;
    }

    public String getCouponStatusName() {
        String desc = CouponStatusEnum.getEnum(couponStatus).getDesc();
        return desc;
    }

    public Operate getOperate() {
        CouponStatusOperateEnum couponStatusOperateEnum = CouponStatusOperateEnum.getEnum(couponStatus);
        Operate operate1 = new Operate(couponStatusOperateEnum.getVie(), couponStatusOperateEnum.getEdi(),
                couponStatusOperateEnum.getDel(), couponStatusOperateEnum.getDat(),
                couponStatusOperateEnum.getTer(), couponStatusOperateEnum.getSta());
        return operate1;

    }

    public List<String> getCouponUrls() {
        if (StringUtils.isNotBlank(fileUrls)) {
            return JSONArray.parseArray(fileUrls, String.class);
        } else {
            return new ArrayList<>();
        }
    }

    public List<Integer> getCouponUseOverlays() {
        if (StringUtils.isNotBlank(couponUseOverlay)) {
            return JSONArray.parseArray(couponUseOverlay, Integer.class);
        } else {
            return new ArrayList<>();
        }
    }
}
